package study.async.springboot.controller;

import cn.hutool.core.thread.ThreadUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import study.eggs.result.Result;
import study.eggs.result.Results;

import java.util.concurrent.Callable;

/**
 * 1.直接返回 Callable 需要有 Executor 支持
 * 2.异步执行完成之后将结果返回给调用方
 */
@Slf4j
@RestController
public class _3_CallableController {

    @RequestMapping("/callable")
    public Callable<Result> callable() {
        log.info(">>>>>> i am controller");

        //这么做的好处避免 web server 的连接池被长期占用而引起性能问题，
        //调用后生成一个非 web 的服务线程来处理，增加 web 服务器的吞吐量
        return () -> {
            ThreadUtil.sleep(3000);
            log.info(">>>>>> i am business logic");
            return Results.ok();
        };
    }
}
